package com.scsj.supermarket.utils;

import android.content.Context;
import android.util.Log;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.Poi;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.scsj.supermarket.event.FirstEvent;
import com.scsj.supermarket.view.activity.baseactivitymodel.BaseActivity;

import java.util.List;

/**百度地图辅助类
 * Created by Administrator on 2018/6/15.
 */

public class BaiduMapHelper {

    private Context context;

    /**
     *  定位相关
     */
    private static LocationClient mLocationClient;

    public static BDLocation mLocation;

    private BaiduMap mBaiduMap;

    private LatLng myPosition;

    private MapView baiduMapView;

    public static String latitude;
    public static String longitude;
    public static String city;



    /**
     * 静态内部类的方式构建单例模式
     */

    private BaiduMapHelper(){}

    private static class BaiduMapHolder{

        private static BaiduMapHelper instance= new BaiduMapHelper();

    }

    public static BaiduMapHelper getInstance(){

        return BaiduMapHelper.BaiduMapHolder.instance;
    }

    /**
     * 传入需要的參數
     * @param
     * @param holdingActivity
     * @return
     */

    public final BaiduMapHelper params (BaseActivity holdingActivity){

        this.context=holdingActivity;
        return this;

    }


    /**
     * 初始化配置
     * @param
     * @return
     */

    public final BaiduMapHelper init(MapView baiduMapView){

        this.baiduMapView= baiduMapView;

        return this;

    }

    /**
     * 配置定位参数
     */
    public void initLocation() {
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        //可选，默认高精度，设置定位模式，高精度，低功耗，仅设备

        option.setCoorType("bd09ll");
        //可选，默认gcj02，设置返回的定位结果坐标系

        int span = 1000;
        option.setScanSpan(0);
        //可选，默认0，即仅定位一次，设置发起定位请求的间隔需要大于等于1000ms才是有效的

        option.setIsNeedAddress(true);
        //可选，设置是否需要地址信息，默认不需要

        option.setOpenGps(true);
        //可选，默认false,设置是否使用gps

        option.setLocationNotify(true);
        //可选，默认false，设置是否当GPS有效时按照1S/1次频率输出GPS结果

        option.setIsNeedLocationDescribe(true);
        //可选，默认false，设置是否需要位置语义化结果，可以在BDLocation.getLocationDescribe里得到，结果类似于“在北京天安门附近”

        option.setIsNeedLocationPoiList(true);
        //可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到

        option.setIgnoreKillProcess(false);
        //可选，默认true，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认不杀死

        option.SetIgnoreCacheException(false);
        //可选，默认false，设置是否收集CRASH信息，默认收集
        option.setEnableSimulateGps(false);
        //可选，默认false，设置是否需要过滤GPS仿真结果，默认需要
        mLocationClient.setLocOption(option);
    }

    /**
     * 实现定位监听 位置一旦有所改变就会调用这个方法
     * 可以在这个方法里面获取到定位之后获取到的一系列数据
     */
    public class MyLocationListener implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation location) {

            //获取定位结果
            StringBuffer sb = new StringBuffer(256);
            sb.append("time : ");
            sb.append(location.getTime());    //获取定位时间

            sb.append("\nerror code : ");
            sb.append(location.getLocType());    //获取类型类型

            sb.append("\nlatitude : ");
            sb.append(location.getLatitude());    //获取纬度信息

            sb.append("\nlontitude : ");
            sb.append(location.getLongitude());    //获取经度信息

            sb.append("\nradius : ");
            sb.append(location.getRadius());    //获取定位精准度

            if (location.getLocType() == BDLocation.TypeGpsLocation) {

                // GPS定位结果
                sb.append("\nspeed : ");
                sb.append(location.getSpeed());    // 单位：公里每小时

                sb.append("\nsatellite : ");
                sb.append(location.getSatelliteNumber());    //获取卫星数

                sb.append("\nheight : ");
                sb.append(location.getAltitude());    //获取海拔高度信息，单位米

                sb.append("\ndirection : ");
                sb.append(location.getDirection());    //获取方向信息，单位度

                sb.append("\naddr : ");
                sb.append(location.getAddrStr());    //获取地址信息

                sb.append("\ndescribe : ");
                sb.append("gps定位成功");

            } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {

                // 网络定位结果
                sb.append("\naddr : ");
                sb.append(location.getAddrStr());    //获取地址信息

                sb.append("\noperationers : ");
                sb.append(location.getOperators());    //获取运营商信息

                sb.append("\ndescribe : ");
                sb.append("网络定位成功");

            } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {

                // 离线定位结果
                sb.append("\ndescribe : ");
                sb.append("离线定位成功，离线定位结果也是有效的");

            } else if (location.getLocType() == BDLocation.TypeServerError) {

                sb.append("\ndescribe : ");
                sb.append("服务端网络定位失败，可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com，会有人追查原因");

            } else if (location.getLocType() == BDLocation.TypeNetWorkException) {

                sb.append("\ndescribe : ");
                sb.append("网络不同导致定位失败，请检查网络是否通畅");

            } else if (location.getLocType() == BDLocation.TypeCriteriaException) {

                sb.append("\ndescribe : ");
                sb.append("无法获取有效定位依据导致定位失败，一般是由于手机的原因，处于飞行模式下一般会造成这种结果，可以试着重启手机");

            }

            sb.append("\nlocationdescribe : ");
            sb.append(location.getLocationDescribe());    //位置语义化信息

            List<Poi> list = location.getPoiList();    // POI数据
            if (list != null) {
                sb.append("\npoilist size = : ");
                sb.append(list.size());
                for (Poi p : list) {
                    sb.append("\npoi= : ");
                    sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
                }
            }

            mLocation = location;

            latitude= mLocation.getLatitude()+"";
            longitude= mLocation.getLongitude()+"";
            city= mLocation.getCity()+"";

            getLocationInfo(latitude,longitude,city);

//            mCity.setText(location.getCity());
            //TODO  暂时去掉定位层
            // 开启定位图层
            mBaiduMap.setMyLocationEnabled(false);
            // 构造定位数据
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                    // 此处设置开发者获取到的方向信息，顺时针0-360
                    .direction(100).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            // 设置定位数据
            mBaiduMap.setMyLocationData(locData);
            myPosition = new LatLng(location.getLatitude(), location.getLongitude());
            MapStatus mMapStatus = new MapStatus.Builder()
                    .target(myPosition)
                    .zoom(16)
                    .build();
            MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
            //改变地图状态
            mBaiduMap.setMapStatus(mMapStatusUpdate);
            mLocationClient.stop();


            if (location.getLatitude() != 0 && location.getLongitude() != 0) {
                // getMapShop(location.getLatitude(), location.getLongitude(), null);
            }
            // 设置定位图层的配置（定位模式，是否允许方向信息，用户自定义定位图标）
            //            mCurrentMarker = BitmapDescriptorFactory
            //                    .fromResource(R.drawable.icon_geo);
            //            MyLocationConfiguration config = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, true, null);
            //            mBaiduMap.setMyLocationConfiguration(config);
            // 当不需要定位图层时关闭定位图层
            //            mBaiduMap.setMyLocationEnabled(false);
            // Log.i("BaiduLocationApiDem", sb.toString());


            mLocationClient.stop();
        }
    }
    public MyLocationListener getListener(){
        return new MyLocationListener();
    }

    public void showLocation(){

        if (baiduMapView== null){
            //只要定位数据，不需要展示地图
        }else {
            //定位，地图都要
            mBaiduMap = baiduMapView.getMap();

            //普通地图
            mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
            // 设置百度地图的缩放等级为15
            mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(15));
            //开启交通图
            mBaiduMap.setTrafficEnabled(false);
            //关闭缩放按钮
            baiduMapView.showZoomControls(false);
            // 开启定位图层
            mBaiduMap.setMyLocationEnabled(true);
        }

        //声明LocationClient类
        mLocationClient = new LocationClient(context);
        //注册监听函数

        mLocationClient.registerLocationListener(this.getListener());

        this.getInstance().initLocation();

        //开始定位
        if (mLocationClient.isStarted()) {
            mLocationClient.requestLocation();
        } else {

            mLocationClient.start();
        }
    }

    /**
     * 获取定位信息
     * @param
     * @param longitude
     * @param latitude
     */
    public void getLocationInfo(String latitude, String longitude, String city){
        RxBus.getDefault().post(new FirstEvent("location",latitude,longitude,city));
    }

    //关闭LocationClient
    public static void closeClient(){
        mLocationClient.stop();
    }


}
